본문으로 건너뛰기

04-015. 피봇

피봇 - Pivot

피봇(pivot)은 표 형태의 데이터를 행과 열을 기준으로 재구성하여 데이터를 요약하거나 집계하는 방법이다. 원본 데이터에서 특정 열을 기준으로 그룹화하고 다른 열의 값을 집계해서 데이터의 패턴이나 분포를 쉽게 파악하거나 모델링에 적합하도록 바꾼다. 피봇은 엑셀의 피봇 테이블이나 파이썬의 pandas 라이브러리의 pivot, pivot_table 함수를 이용한다.
데이터베이스에서 SQL을 이용해서 하기도한다.

피봇을 사용하면 대량의 데이터를 다양한 각도에서 요약하여 볼 수 있으며 원하는 기준에 따라 합계, 평균, 개수 등 다양한 집계 결과를 얻을 수 있다. 예를 들어, 판매 데이터에서 '지역'과 '상품'별로 매출 합계를 구하거나, '월'별로 고객 수를 집계하는 등의 작업이 가능하다.

(())

지역상품매출
서울A100
서울B150
부산A200
부산B120
대구A130
대구B170
서울A90
부산B110

위의 테이블은 데이터를 저정할 때 많이 쓰는 데이터 저장 방식이다. 피봇의 흔한 예는 위와 같은 데이터를 아래와 같이 바꾸는 것이다.

(())

지역AB
서울190150
부산200230
대구130170

위와 같이 피봇을 사용하면 '지역'을 행으로, '상품'을 열로 변환하여 각 지역별, 상품별 매출 합계를 한눈에 볼 수 있다. 패턴을 찾거나 비교하기 쉽다. 데이터 분석에서는 확인하고 싶은 관심사에 따라 데이터를 빈번하게 바꿔야한다.
그리고 위와 같은 방식은 통계적 분석이나 모델링에 적합하다.

우선 Python으로 피봇하는 예제코드이다. Colab에서 실행한다.

((노트북코드)): ((셀1))

import pandas as pd

# 예시 판매 데이터 생성
data = {
'지역': ['서울', '서울', '부산', '부산', '대구', '대구', '서울', '부산'],
'상품': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'B'],
'매출': [100, 150, 200, 120, 130, 170, 90, 110]
}

df = pd.DataFrame(data)
print(df)

((출력1)): 지역 상품 매출 0 서울 A 100 1 서울 B 150 2 부산 A 200 3 부산 B 120 4 대구 A 130 5 대구 B 170 6 서울 A 90 7 부산 B 110

((셀1))

# pivot_table 함수를 사용하여 피봇 테이블 생성
pivot_table = pd.pivot_table(df,
values='매출', # 집계할 값
index='지역', # 행 인덱스가 될 열
columns='상품', # 열 인덱스가 될 열
aggfunc='sum') # 집계 함수 (합계)
print(pivot_table)

((출력2)):

상품    A    B
지역
대구 130 170
부산 200 230
서울 190 150

앞에서 설명한 것 처럼 pivot을 하는 방법은 코딩하는 방법과 SQL을 사용하는 방법이 있는 단순한 작업이 아니기 때문에 작은 데이터는 코딩으로 처리하고 큰 데이터는 데이터베이스에서 복잡한 SQL을 작성해서 처리하는 것이 일반적이다. 빅데이터라면 좀 더 복잡하다. Pandas를 사용할 수 있을 정도의 크지 않은 데이터는 Pandas에서 Pivot 기능을 제공한다.

위의 셀에 있는 코드 중에 pd.pivot_table 함수가 쉽게 처리 해준다. 이 함수는 처음 사용할 때는 혼동되기 쉽기 때문에 인수(argument)의 용도에 대해서 잘 봐둬야 한다. values는 컬럼이 새로 생기거나 로우에 변화가 생길 때 정리될 값을 말한다. index는 그대로 로우에 나열되도록 남겨둘 컬럼을 말한다. 위에서는 “지역”이고 “지역”의 값을 그대로 로우를 구분해서 두는 것이다. “지역”이라는 이름의 컬럼은 피봇한 후에도 그대로 남아 있다. columns는 컬럼으로 올릴 값이 일는 컬럼명을 말한다. 위에서는 “상품”의 값을 각각 종류별로 컬럼으로 만드려는 것이다. 변환이 되고 난 후에는 “상품”이라는 이름의 컬럼은 사라지게 된다. aggfunc는 집계(aggregation function)을 뜻하는 것으로 값이 이동을 하면 중복이 생길 때 처리할 함수를 적는다. 보통 더하기 때문에 sum함수의 이름을 문자열로 적는다. 특별히 다른 처리를 해야 한다면 “평균” 같은 ”“mean”를 적을 수도 있다.

위와 같은 피봇은 직접 여러번 해보고 연습해 두지 않으면 실제 업무를 진행할 때 원하는대로 되지 않아 시간낭비를 많이 하게 된다. AI챗봇의 도움을 받을 수 있지만 직접 해보는 것을 권한다.

AI챗봇을 이용할 때는 데이터를 먼저 제공해줘야 하는데 csv 파일을 만들어서 올릴 수 도 있고 프롬프트에 붙여 넣을 수도 있다. 형식은 반드시 csv가 아니어도 되지만 위와 같은 테이블은 가끔 정리를 못할 때도 있다. csv 파일은 많은 도구들이 불러오기, 저장하기를 지원하기 때문에 편리한 면이 있다.

다음과 같이 AI챗봇에게 코드 작성을 요구해본다.

((프롬프트)):

다음의 데이터를 Python pandas로 피봇해주세요. 상품 컬럼의 값을 컬럼으로 올려주세요.

지역,상품,매출
서울,A,100
서울,B,150
부산,A,200
부산,B,120
대구,A,130
대구,B,170
서울,A,90
부산,B,110

((AI챗봇 답)):

import pandas as pd

# 데이터 생성
data = """지역,상품,매출
서울,A,100
서울,B,150
부산,A,200
부산,B,120
대구,A,130
대구,B,170
서울,A,90
부산,B,110"""

# 문자열 데이터를 DataFrame으로 변환
import io
df = pd.read_csv(io.StringIO(data))

# 피봇 테이블 생성
pivot_table = pd.pivot_table(df,
values='매출',
index='지역',
columns='상품',
aggfunc='sum')

# 결과 출력
print(pivot_table)

피봇은 데이터 분석에서 중요한 역할을 하며, 데이터의 구조를 바꿔 새로운 인사이트를 얻는 데에 유용하게 활용된다.

피봇(pivot)의 정식 명칭은 "피벗 테이블(Pivot Table)"이다.
"Pivot"이라는 단어는 영어로 '중심축', '회전축', '축을 중심으로 돌리다'라는 뜻을 가진다.
데이터 분석에서 피벗은 데이터를 특정 기준(축)을 중심으로 행과 열을 바꿔가며 다양한 관점에서 요약, 집계하는 것을 의미한다.

즉, 피벗 테이블은 데이터를 회전(pivot)시켜 새로운 형태로 재구성한다는 의미에서 유래되었다.
엑셀(Excel)이나 파이썬의 pandas 라이브러리 등에서 "Pivot Table" 또는 "pivot_table"이라는 이름으로 사용된다.

피봇(pivot)과 함께 데이터 전처리에서 자주 등장하는 개념으로 캐스팅(casting), 멜팅(melting), 트랜스폼(transform)이 있다. 각각의 개념과 차이점을 아래와 같이 정리할 수 있다.

피봇(Pivot)

  • 정의: 데이터를 특정 열을 기준으로 행과 열을 재구성하여 요약·집계하는 작업입니다.

  • 주요 기능: 집계(합계, 평균, 개수 등), 데이터 요약, 행/열 전환

  • 예시:

    이름과목점수
    김철수수학90
    김철수영어85
    이영희수학95
    이영희영어80

    위 데이터를 피봇하면 다음과 같이 변환할 수 있습니다.

    이름수학영어
    김철수9085
    이영희9580
  • 파이썬 pandas 예시:

    import pandas as pd

    df = pd.DataFrame({
    '이름': ['김철수', '김철수', '이영희', '이영희'],
    '과목': ['수학', '영어', '수학', '영어'],
    '점수': [90, 85, 95, 80]
    })

    pivot_df = df.pivot(index='이름', columns='과목', values='점수')
    print(pivot_df)

멜팅(Melting)

  • 정의: 넓은(wide) 형태의 데이터를 긴(long) 형태로 변환하는 작업입니다.
    즉, 여러 열에 나눠져 있는 값을 하나의 열로 모으는 과정입니다.

  • 주요 기능: 데이터의 구조를 단순화, 분석 및 시각화에 용이하게 변환

  • 예시:

    이름수학영어
    김철수9085
    이영희9580

    위 데이터를 멜팅하면 다음과 같이 변환됩니다.

    이름과목점수
    김철수수학90
    김철수영어85
    이영희수학95
    이영희영어80
  • 파이썬 pandas 예시:

    melted_df = pd.melt(pivot_df.reset_index(), id_vars=['이름'], var_name='과목', value_name='점수')
    print(melted_df)

캐스팅(Casting)

  • 정의: 멜팅과 반대되는 개념으로, 긴(long) 형태의 데이터를 넓은(wide) 형태로 변환하는 작업입니다.
    즉, 행에 있는 값을 여러 열로 펼치는 과정입니다.
  • 주요 기능: 데이터의 요약, 피봇과 유사하게 사용됨
  • 예시:
    위의 멜팅 예시에서 나온 데이터를 다시 wide 형태로 바꾸는 것(=피봇과 유사)
  • 파이썬 pandas 예시:
    casted_df = melted_df.pivot(index='이름', columns='과목', values='점수')
    print(casted_df)

트랜스폼(Transform)

  • 정의: 데이터의 각 행 또는 그룹에 대해 특정 연산(함수)을 적용하여 값을 변환하는 작업입니다.
  • 주요 기능: 그룹별 평균, 표준화, 정규화 등 다양한 변환 작업에 사용
  • 예시:
    학생별 점수에서 각 과목의 평균 점수로 값을 변환하거나, 표준화하는 작업 등
  • 파이썬 pandas 예시:
    # 과목별 평균 점수로 변환
    df['과목별평균'] = df.groupby('과목')['점수'].transform('mean')
    print(df)

요약

  • 피봇(pivot)/캐스팅(casting): long → wide (행을 열로 펼침)
  • 멜팅(melting): wide → long (여러 열을 하나의 열로 모음)
  • 트랜스폼(transform): 데이터 값 자체를 변환(함수 적용, 그룹별 연산 등)

이러한 변환 기법들은 데이터 분석에서 데이터를 원하는 형태로 가공하고, 다양한 관점에서 분석할 수 있도록 도와줍니다.